var 棋盘;
var 各音;
var 字母;
var 路径 = [];
var 键盘路径 = [];
var 状态 = 0;		/* 0 空闲, 1 拖动事件, 2 键盘事件 */
var 上块 = -1;
var 已用;
var 已用显示;

function 擦除类(类) {
	棋盘.classList.remove('board-success');
	棋盘.classList.remove('board-duplicate');
	for (var i of document.getElementsByClassName('board-item'))
		i.classList.remove('board-item-mark');
}

function 清空已选() {
	路径 = [];
	键盘路径 = [];
	状态 = 0;
	上块 = -1;
	擦除类();
}

function 按下事件() {
	清空已选();
	状态 = 1;
	event.preventDefault();
}

function 判定() {
	const 组成字 = 路径.map(x => 字母[x]).join('');
	if (路径.length < 3 || !各音.has(组成字))
		return false;
	if (已用.has(组成字)) {
		棋盘.classList.add('board-duplicate');
		return true;
	}
	已用.add(组成字);
	var 拼音 = document.createElement('ruby');
	已用显示.appendChild(拼音);
	拼音.innerHTML = `${各音.get(组成字)}<rt lang="art-x-xdi8">${组成字}</rt>`;
	console.log(路径);
	棋盘.classList.add('board-success');
	return true;
}

const 连通偏移 = new Set([-6, -5, -4, -1, 1, 4, 5, 6]);
function 移动事件(块) {
	const 序号 = 块.dataset.pos;
	if (序号 == 上块)
		return;
	if (上块 != -1 && !连通偏移.has(序号 - 上块)) {
		清空已选();
		return;
	}
	上块 = 序号;
	路径.push(序号);
	块.parentNode.classList.add('board-item-mark');
	event.preventDefault();
}

function 鼠标移动事件() {
	if (状态 != 1)
		return;
	移动事件(event.currentTarget);
}

function 触摸移动事件() {
	if (状态 != 1)
		return;
	const 顶 = document.elementFromPoint(
		event.touches[0].clientX, event.touches[0].clientY);
	if (顶.dataset.pos)
		移动事件(顶);
}

function 松开事件() {
	if (状态 != 1)
		return;
	if (判定())
		window.setTimeout(() => 擦除类(), 200);
	else
		清空已选();
	状态 = 0;
}

function 重置棋盘() {
	function 清除数据() {
		已用 = new Set();
		已用显示.innerHTML = '';
	}
	function 抽字母() {
		字母 = [];
		for (var i = 0; i < 25; ++i) {
			const 所有 = '12345678aAbBcDdeEFfgHhijklLmnNopqrstTuVvwxyYz'.split('');
			字母.push(所有[Math.floor(Math.random() * 所有.length)]);
		}
	}
	function 绘制() {
		棋盘.innerHTML = '';
		for (var i = 0, 号 = 0; i < 5; ++i) {
			var 行 = document.createElement('div');
			行.classList.add('board-row');
			棋盘.appendChild(行);
			for (var j = 0; j < 5; ++j, ++号) {
				var 格 = document.createElement('div');
				行.appendChild(格);
				格.classList.add('board-item');
				var 内 = document.createElement('span');
				格.appendChild(内);
				内.innerText = 字母[号];
				内.dataset.pos = 号;
				内.addEventListener('mousemove', 鼠标移动事件);
				内.addEventListener('touchmove', 触摸移动事件);
			}
		}
	}
	清除数据();
	抽字母();
	绘制();
}

window.onload = () => {
	function 添加事件() {
		棋盘 = document.getElementById('board-wrapper');
		棋盘.addEventListener('mousedown',  按下事件);
		棋盘.addEventListener('touchstart', 按下事件);
		var 全 = document.getElementsByTagName('main')[0];
		全.addEventListener('mouseup',  松开事件);
		全.addEventListener('touchend', 松开事件);
		已用显示 = document.getElementById('chained');
	}
	添加事件();
	function 获取字音(数据) {
		各音 = new Map();
		数据.split('\n').forEach((行) => {
			var 表 = 行.split('\t', 3);
			var 音 = 表[1];
			var 字 = 表[0];
			if (音)
				各音.set(音, 字);
		});
	}
	var 请求 = new XMLHttpRequest();
	请求.onreadystatechange = () => {
		if (请求.readyState == 4 && 请求.status == 200) {
			获取字音(请求.responseText);
			重置棋盘();
		}
	}
	请求.open('GET', '/xdi8/data/hanzi2xdi8.tsv', true);
	请求.send();
}
